package com.nian.common.base.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 用途：
 * 开发：zhangmj
 * 日期：2020/4/5 0005 20:07
 */
public class RegexUtils {

    /**
     * 正则验证字符串
     * @param regex
     * @param str
     * @return
     */
    private final static boolean match(String regex, String str) {
        if(StringUtils.isNotEmpty(str) && StringUtils.isNotEmpty(regex)){
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(str);
            return m.matches();
        }
        return false;
    }

    /**
     * 验证 Email
     * @param email
     * @return
     */
    public static  boolean isEmail(String email) {
        String regex = "\\w+@\\w+\\.[a-z]+(\\.[a-z]+)?";
        return match(regex, email);
    }

    /**
     * 验证 URL 地址
     * @param url
     * @return
     */
    public static boolean isUrl(String url) {
        String regex = "(https?://(w{3}\\.)?)?\\w+\\.\\w+(\\.[a-zA-Z]+)*(:\\d{1,5})?(/\\w*)*(\\??(.+=.*)?(&.+=.*)?)?";
        return match(regex, url);
    }

    /**
     * 验证手机号码
     * @param mobile
     * @return
     */
    public static boolean isMobile(String mobile) {
        String regex = "(\\+\\d+)?1[3458]\\d{9}$";
        return match(regex, mobile);
    }

    /**
     * 判断是否为数值
     * @param numeric
     * @return
     */
    public static boolean isNumeric(String numeric) {
        return StringUtils.isNumeric(numeric);
    }

    /**
     * 验证整数（正整数和负整数）
     *
     * @param digit
     *            一位或多位0-9之间的整数
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkDigit(String digit) {
        String regex = "\\-?[1-9]\\d+";
        return match(regex, digit);
    }

    /**
     * 判断是否为数字字符串
     *
     * @param digit
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean isDigitString(String digit) {
        String regex = "^[0-9]*$";
        return match(regex, digit);
    }

    /**
     * 验证 IP
     * @param ip
     * @return
     */
    public static boolean isIP(String ip) {
        String num = "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)";
        String regex = "^" + num + "\\." + num + "\\." + num + "\\." + num + "$";
        return match(regex, ip);
    }

    /**
     * 验证中国邮政编码
     * @param postcode
     * @return
     */
    public static boolean isPostcode(String postcode) {
        String regex = "[1-9]\\d{5}";
        return match(regex, postcode);
    }

    /**
     * 验证用户名, 数字、字母、下划线组成!
     * 6到15位
     * @param username
     * @return
     */
    public static boolean username(String username) {
        String regex = "^([a-z]|[A-Z])[\\w]{6,20}$";
        return match(regex, username);
    }

    /**
     * 验证两到四个汉字
     * @param trueName
     * @return
     */
    public static boolean trueName(String trueName) {
        String regex = "^[\u4e00-\u9fa5]{2,4}$";
        return match(regex, trueName);
    }


    /**
     * 是否是一个合法的 Long 类型
     * @param str
     * @return
     */
    public static boolean isLong(String str) {
        try {
            Long.parseLong(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
}
